package demo.icanci.pattern.template;

/**
 * @author icanci
 * @date Created in 2021/02/07 23:47
 * @version 1.0
 */
@SuppressWarnings("all")
public abstract class KTVRoom {
    public void procedure() {
        openDevice();
        orderSong();
        orderExtra();
        pay();
    }

    // 模版自带方法 使用之前必须得打开设备
    private void openDevice() {
        System.out.println("打开音响和视频");
    }

    // 子类必须实现的方法，必须要选歌
    protected abstract void orderSong();

    // 钩子函数，额外开销的情况选择
    protected void orderExtra() {

    }

    // 模版自带方法，必须付款
    private void pay() {
        System.out.println("支付本次的消费账单");
    }
}
